Kernfragen dieser Lehreinheit:


Wiederholung aus der Vorlesung: Skalenniveaus

Skala Aussage Transformation Zentrale Lage Dispersion
Nominal Äquivalenz eineindeutig Modus Relativer Informationsgehalt
Ordinal Ordnung monoton Median Interquartilsbereich
Intervall Verhältnis von Differenzen positiv linear Mittelwert Standardabweichung, Varianz
Verhältnis Verhältnisse Ähnlichkeit
Absolut absoluter Wert Identität

Vorbereitende Schritte

load('fb19.rda')   # Daten laden
names(fb19)        # Namen der Variablen
##  [1] "mdbf1"      "mdbf2"      "mdbf3"      "mdbf4"      "mdbf5"     
##  [6] "mdbf6"      "mdbf7"      "mdbf8"      "mdbf9"      "mdbf10"    
## [11] "mdbf11"     "mdbf12"     "lz"         "extra"      "vertr"     
## [16] "gewis"      "neuro"      "intel"      "pro"        "grund"     
## [21] "fach"       "ziel"       "ziel_sonst" "lerntyp"    "geschl"    
## [26] "job"        "ort"        "ort12"      "wohnen"     "uni1"      
## [31] "uni2"       "uni3"       "uni4"
dim(fb19)          # Anzahl Zeile und Spalten
## [1] 118  33

Der Datensatz hat also 118 Beobachtungen auf 33 Variablen.


Nominalskalierte Variablen

Typische Beispiele für nominalskalierte Variablen in der Psychologie sind das Geschlecht (z.B. Variable “geschl” in erstis), die Experimentalbedingung (z.B. “UV” und “AV”), die Gruppenzugehörigkeit, … Nominalskalierte Variablen sollten in R als Faktoren hinterlegt werden. Faktoren in R sind Vektoren mit einer vorab definierten Menge an vorgegebenen möglichen Ausprägungen. Sowohl numerische als auch character-Variablen können als Faktor kodiert werden, was mit jeweiligen Vorteilen einhergeht:

Jeder numerischen Faktorstufe (level) kann ein Label zugewiesen werden. Faktorstufe und –label bestehen auch dann, wenn die entsprechende Ausprägung empirisch nicht auftritt.

Beispiel 1: Die (numerische) Variable geschl als Faktor aufbereiten

str(fb19$geschl)
##  int [1:118] 1 1 1 2 NA 1 1 1 1 1 ...
fb19$geschl
##   [1]  1  1  1  2 NA  1  1  1  1  1  1  1  1  2  1  1  2  1  1  2  1  1  2  1  2
##  [26]  1  2  1  1  1  1  1  1  1  1  2  1  2  2  1  1  1  2  2  1  1  2  2  1  1
##  [51]  1  1  2  1  1  1  2  2  1  1  1  1  1  1 NA  2  2  1  1  1  1  2  2  2  1
##  [76]  1  1  1  2  1  1  1  1  2  1  1  1  1  1  1  1  1  1  1  2  1  1  1  1  2
## [101]  1  2 NA  1  1  1  1  1  1  1  2  1  1  1  2  2  1  1

Die Variable geschl liegt numerisch vor, es treten die Werte 1 und 2 empirisch auf. Anhand des Kodierschemas (Datei Variablenübersicht.docx) kann den Zahlen eine inhaltliche Bedeutung zugewiesen werden. Beispielsweise bedeutet der Wert 1 “weiblich”. Diese Label werden nun im Faktor hinterlegt.

Vorgehensweise:

fb19$geschl_faktor <- factor(fb19$geschl,                                   # Ausgangsvariable
                             levels = 1:3,                                  # Faktorstufen
                             labels = c("weiblich", "männlich", "anderes")) # Label für Faktorstufen
str(fb19$geschl_faktor)
##  Factor w/ 3 levels "weiblich","männlich",..: 1 1 1 2 NA 1 1 1 1 1 ...
head(fb19$geschl_faktor)
## [1] weiblich weiblich weiblich männlich <NA>     weiblich
## Levels: weiblich männlich anderes

Beispiel 2: Lieblingsfach (numerisch) als Faktor aufbereiten

Analog dazu wird nachfolgend die ebenfalls numerische Variable fach in einen Faktor umgewandelt. Sie wurde wie folgt erhoben:

fb19$fach
##   [1]  1  4  3  4  4  4  2  5  3  1  4  2  3  4  4  1  1  2  2  2  1  1  4  3  1
##  [26]  2  1  1  3  1  3 NA  4  2  2  4  3  4  1  2  5  2  4  3  1  2  1  2  4  4
##  [51]  4  2  1  4  4  1  4  5  4  2  1  4  4  3 NA  1  4  1  3  4  3  3  3  1  4
##  [76]  3  2  4  2  1  2  3  5  4  1  4  1  4  2  1  4  3  3  5  4  3  4  4  3  3
## [101]  4  1 NA  1  1  4  4  1  2  4  4  1  1  4  2  1  2  4

Es treten die Ausprägungen 1 bis 5 empirisch auf. Auch hier werden die Label aus dem Kodierschema zugewiesen.

fb19$fach <- factor(fb19$fach, 
                    levels = 1:5,
                    labels = c('Allgemeine', 'Biologische', 'Entwicklung', 'Klinische', 'Diag./Meth.'))
str(fb19$fach)
##  Factor w/ 5 levels "Allgemeine","Biologische",..: 1 4 3 4 4 4 2 5 3 1 ...

Hinweis: In Beispiel 2 wurde die Ursprungsvariable mit dem Faktor überschrieben. Sie ist nun verschwunden, der Datensatz enthält nur noch den Faktor, nicht mehr die numerische Variable.

Beispiel 3: Einen character-Vektor als Faktor aufbereiten

Um einen character-Vektor in einen Faktor umzukodieren, kann die Funktion as.factor() verwendet werden (siehe Skript zur Lehreinheit 1). Die Ausprägungen werden dann automatisch als Labels übernommen. Die Stufen (levels) werden in alphabetischer Reihenfolge vergeben.

Nachfolgend wird zur Illustration die offenene Freitextantwort zum Grund für das Psychologiestudium (Variable grund) in einen Faktor umgewandelt. Dies ist nicht sinnvoll, da jede einzelne Freitextantwort vermutlich nur genau einmal vorkommt und später sowieso nicht (ohne zusätzliche Kodierung) in statistischen Analysen weiterverwendet werden kann.

str(fb19$grund)                            # Ursprungsvariable: Character
##  chr [1:118] "Ich hatte keine Ahnung, was ich machen soll und es klang ziemlich interessant. Dachte mir dann, warum nicht?" ...
fb19$grund_faktor <- as.factor(fb19$grund) # Umwandlung in Faktor
str(fb19$grund_faktor)                     # neue Variable: Faktor
##  Factor w/ 93 levels "","- Arbeitsfelder, die sich mit dem Menschen befassen, sind interessant für mich\n- ich bin ein empathischer Mens"| __truncated__,..: 35 93 92 53 87 84 16 1 86 54 ...

Hinweise zu den Levels und Labels

Die Reihenfolge von Levels und Labels ergibt sich während der Faktorerstellung:

Die Labels eines Faktors können mit der Funktion levels() abgerufen werden. Die Reihenfolge kann mithilfe der relevel()-Funktion geändert werden. Dafür muss dasjenige Label angesprochen werden, das die erste Position einnehmen soll (hier: ‘Diag./Meth.’).

levels(fb19$fach)         # Abruf
## [1] "Allgemeine"  "Biologische" "Entwicklung" "Klinische"   "Diag./Meth."
fb19$fach <- relevel(
  fb19$fach,              # Bezugskategorie wechseln
  'Diag./Meth.')          # Neue Bezugskategorie

Häufigkeitstabellen

Eine deskriptivstatistische Möglichkeit zur Darstellung diskreter (zählbarer) nominalskalierter Variablen sind Häufigkeitstabellen. Diese können in R mit der Funktion table() angefordert werden.

Absolute Häufigkeiten

table(fb19$fach)
## 
## Diag./Meth.  Allgemeine Biologische Entwicklung   Klinische 
##           5          30          21          20          39

Häufig sind relative Häufigkeiten informativer. Nachfolgend werden zwei Möglichkeiten zur Erstellung von relativen Häufigkeitstabellen in R gezeigt.

Relative Häufigkeiten (manuell)

Relative Häufigkeiten können aus absoluten Häufigkeiten abgeleitet werden: \(h_j = \frac{n_j}{n}\).

Diese einfache Rechenvorschrift (Kategorienhäufigkeit geteilt durch Gesamthäufigkeit) kann auf das gesamte Tabellenobjekt angewendet werden. So wird jede einzelne absolute Kategorienhäufigkeit am Gesamtwert relativiert, es resultiert eine Tabelle der relativen Häufigkeiten.

tab <- table(fb19$fach) # Absolute Haeufigkeiten
sum(tab)                # Gesamtzahl
## [1] 115
tab / sum(tab)          # Relative Haeufigkeiten
## 
## Diag./Meth.  Allgemeine Biologische Entwicklung   Klinische 
##  0.04347826  0.26086957  0.18260870  0.17391304  0.33913043

Relative Häufigkeiten (per Funktion)

Alternativ kann die Funktion prop.table() auf das Tabellenobjekt mit den absoluten Häufigkeiten angewendet werden.

tab <- table(fb19$fach) # Absolute
prop.table(tab)         # Relative
## 
## Diag./Meth.  Allgemeine Biologische Entwicklung   Klinische 
##  0.04347826  0.26086957  0.18260870  0.17391304  0.33913043

Nicht einmal 5% Ihres Jahrgangs geben als Lieblingsfach “Diagnostik/Methoden” an! Vielleicht können wir Sie mit dem nächsten Thema begeistern. :-)


Grafiken in R

Die Darstellung als Tabelle wirkt häufig langweilig. Zu viele Tabellen in einem Bericht / einer Arbeit schrecken Leser meist ab. Nachfolgend werden grafische Darstellungsformen für diskrete nominalskalierte Variablen gezeigt.

Säulen- oder Balkendiagramm

barplot(tab)

Die Grafik erscheint in der RStudio-Standardansicht “unten rechts” im Reiter “Plots”:

Kuchendiagramm

pie(tab)

Zusatzargumente für Plots

Die Funktionen zur Erstellung sehr einfacher Grafiken sind also denkbar einfach - die Grafiken selbst aber zunächst nicht unbedingt hübsch. R bietet diverse Zusatzargumente zur Anpassung der Optik von Grafiken.

Argument Bedeutung
main Überschrift
las Schriftausrichtung (0, 1, 2, 3)
col Farbenvektor
horiz Horizontale Balkenausrichtung (TRUE/FALSE)
legend.text Beschriftung in der Legende
xlim, ylim Beschränkung der Achsen
xlab, ylab Beschriftung der Achsen

Farben in R

R kennt eine ganze Reihe vordefinierter Farben (\(N = 657\)) mit teilweise sehr poetischen Namen. Diese können mit der Funktion colors() (ohne Argument) abgerufen werden. Hier sind die ersten 20 Treffer:

colors()[1:20]
##  [1] "white"         "aliceblue"     "antiquewhite"  "antiquewhite1"
##  [5] "antiquewhite2" "antiquewhite3" "antiquewhite4" "aquamarine"   
##  [9] "aquamarine1"   "aquamarine2"   "aquamarine3"   "aquamarine4"  
## [13] "azure"         "azure1"        "azure2"        "azure3"       
## [17] "azure4"        "beige"         "bisque"        "bisque1"

Die Farben aus der Liste können als Zahl (Index) oder per Name angesprochen werden. Eine vollständige Liste der Farben findet sich zum Beispiel unter http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf. Farben können aber auch per RGB-Vektor (Funktion rgb()) oder HEX-Wert angesprochen werden.

Zusätzlich können Farbpaletten verwendet werden. Sie bestehen aus einem Farbverlauf, aus dem einzelne Farben “herausgezogen” werden, wodurch ein zusammengehöriges Farbthema in einer Abbildung entsteht. R liefert einige dieser Paletten: rainbow(...), heat.colors(...), topo.colors(...), … Die Farbpalette wird ebenfalls per col-Argugment spezifiziert. Technisch handelt es sich um eine Funktion, für die als Argument die Anzahl der Farben spezifiziert werden muss, die aus der Palette “gezogen” werden sollen. Beispielsweise werden mit col = rainbow(5) fünf Farben aus der rainbow-Palette gezogen.

Beispiel für angepasste Abbildung

barplot(tab,
 col = rainbow(20),
 xlab = 'Studierende (Anzahl)',
 main = 'Lieblingsfach im 1. Semester', 
 las=1)

Grafiken speichern

Es gibt zwei Möglichkeiten, um in R erzeugte Grafiken als Bilddatei zu speichern: manuell und per Funktion.

Möglichkeit 1: Manuelles Speichern

Klicken Sie auf die Schaltfläche “Export” und dann auf “Save as Image”…

…und spezifizieren Sie dann Dateiname (ggf. Pfad) und Größe/Größenverhältnis.

Wenn kein Pfad spezifiziert wird, erscheint die Datei in Ihrem aktuellen Arbeitsverzeichnis.

Möglichkeit 2: Speichern mit der Funktion jpeg("Dateiname.jpg")

Die Grafikerstellung folgt auf die jpeg()-Funktion und wird mit der Funktion dev.off() abgeschlossen.

jpeg("Mein-Boxplot.jpg", width=15, height=10, units="cm", res=150)
barplot(tab,
 col = rainbow(20),
 xlab = 'Studierende (Anzahl)',
 main = 'Lieblingsfach im 1. Semester', 
 las=1)
dev.off()

Auch hier gilt: Wenn kein Pfad spezifiziert wurde, liegt die Datei in Ihrem Arbeitsverzeichnis. In der Funktion jpeg() kann mit den Argumenten width, height, units und res Größe, Größenverhältnis und Auflösung gesteuert werden.


Deskriptivstatistische Kennwerte auf Nominalskalenniveau

Modus

Der Modus (Mo) ist ein Maß der zentralen Tendenz, das die häufigste Ausprägung einer Variablen anzeigt. Die Häufigkeiten sind ja schon in der Häufigkeitstabelle enthalten. Man könnte den Modus also einfach ablesen. Das gleiche lässt sich allerdings auch anhand von Funktionen tun:

tab            # Tabelle ausgeben
## 
## Diag./Meth.  Allgemeine Biologische Entwicklung   Klinische 
##           5          30          21          20          39
max(tab)       # Größte Häufigkeit
## [1] 39
which.max(tab) # Modus
## Klinische 
##         5

Der Modus der Variable fach lautet also Klinische, die Ausprägung trat 39 mal auf.

Relativer Informationsgehalt

Der relative Informationsgehalt ist ein Dispersionsmaß, das schon auf Nominalskalenniveau funktioniert. Dafür gibt es in R allerdings keine Funktion! Aus Lehreinheit 1 wissen Sie jedoch, dass R als Taschenrechner genutzt werden kann, folglich können beliebig komplexe Gleichungen in R umgesetzt werden. Die Formel zur Berechnung des relativen Informationsgehalts \(H\) lautet:

\[H = -\frac{1}{\ln(k)} \sum_{j=1}^k{h_j * \ln h_j} \]

\(n_j\) bezeichnet alle gültigen Antworten und kann als Summe der Häufigkeiten in tab abgelesen werden.

hj <- prop.table(tab)       # hj erstellen
ln_hj <- log(hj)            # Logarithmus bestimmen
ln_hj                       # Ergebnisse für jede Kategorie
## 
## Diag./Meth.  Allgemeine Biologische Entwicklung   Klinische 
##   -3.135494   -1.343735   -1.700410   -1.749200   -1.081370
summand <- ln_hj * hj       # Berechnung für jede Kategorie
summe <- sum(summand)       # Gesamtsumme
relinf <- -1/log(5) * summe # Relativer Informationsgehalt
relinf
## [1] 0.9123118

Eine alternative Schreibweise, die ohne Zwischenschritte auskommt, dafür aber stark verschachtelt ist, lautet:

- 1/log(5) * sum(prop.table(table(fb19$fach)) * log(prop.table(table(fb19$fach))))
## [1] 0.9123118

Der relative Informationsgehalt der Variable fach beträgt demnach 0.912.


Ordinalskalierte Variablen

In diesem Abschnitt lernen Sie deskriptivstatistische Kennwerte für ordinalskalierte Variablen kennen. Aus der Vorlesung wissen Sie schon, dass Median und Interquartilsabstand (IQB) nur für die Klasse der geordneten Kategorien (auch “Rangklassen”) sinnvoll sind, nicht für singuläre Daten (“Rangwerte”).

Zunächst aber eine Wiederholung: Wie Sie aus der Vorlesung wissen, könnnen die in der Tabelle am Anfang dieses Dokuments aufgeführten statistischen Kennwerte (Zentrale Lage, Dispersion) auch für Skalenniveaus genutzt werden, die “weiter unten” in der Tabelle stehen. Für ordinalskalierte Variablen (Rangklassen) kann also auch der Modus berechnet werden.

Nachfolgend soll mit Item 4 des mdbf gearbeitet werden. Es wurde wie folgt erhoben:

Es treten die Werte 1 bis 4 empirisch auf, außerdem gibt es einen fehlenden Wert (dargestellt als NA):

fb19$mdbf4
##   [1]  1  3  1  2  4  2  3  1  1  1  3  1  2  2  2  3  1  3  2  3  1  2  2  2  1
##  [26]  1  1  1  1  4  1  3  2  1  2  1  1  1  2  2  1  2  2  1  1  2  1  2  1  1
##  [51]  2  1  3  1  4  2  4  2  1  2  2  1  1  1  2  3  3  2  1  1  3  2  2  1  2
##  [76]  1  1 NA  1  1  2  4  2  3  1  2  1  3  1  1  3  1  3  2  1  1  1  1  1  2
## [101]  1  4  1  1  3  3  2  4  3  3  3  1  1  1  1  1  2  1

Wiederholung:

table(fb19$mdbf4)               # Absolute Haeufigkeiten
## 
##  1  2  3  4 
## 56 34 20  7
prop.table(table(fb19$mdbf4))   # Relative Haeufigkeiten
## 
##          1          2          3          4 
## 0.47863248 0.29059829 0.17094017 0.05982906
which.max(table(fb19$mdbf4))    # Modus
## 1 
## 1

Fehlende Werte

Fehlende Werte in empirischen Untersuchungen können aus vielen Gründen auftreten:

Für statistische Analysen sind fehlende Werte ein Problem, weil sie außerhalb der zulässigen Antworten liegen.

Fehlende Werte in R

Fehlende Werte werden im Datensatz als NA dargestellt. In R kann man solche Fälle auf zwei unterschiedlichen Ebenen berücksichtigen:


Deskriptivstatistische Kennwerte ab Ordinalskalenniveau

Median für ordinalskalierte Variablen

median(fb19$mdbf4)                 # Ohne Argument für NA: funktioniert nicht
## [1] NA
median(fb19$mdbf4, na.rm = TRUE)   # Expliziter Ausschluss: funktioniert
## [1] 2

Der Median für die Variable mdbf4 beträgt also 2.

Quantile und IQB

Für eine Beschreibung der Dispersion wird häufig der Interquartilsbereich (IQB) genutzt. IQB ist der Bereich zwischen dem 1. und dem 3. Quartil. Auch dafür gibt es keine Funktion in R, das Dispersionsmaß kann aber einfach “per Hand” selbst berechnet werden:

\[IQB = Q_3 - Q_1\]

Um die Quartile oder jedes beliebige andere Quantil einer Verteilung zu erhalten, kann die Funktion quantile() verwendet werden:

quantile(fb19$mdbf4,
         c(.25, .5, .75),                   # Quartile anfordern
         na.rm = T)
## 25% 50% 75% 
##   1   2   2

Zur Berechnung des IQB wird nun die Differenz aus drittem und ersten Quartil gebildet:

quantile(fb19$mdbf4, .75, na.rm=T) - quantile(fb19$mdbf4, .25, na.rm=T) 
## 75% 
##   1

Der IQB der Variable mdbf4 beträgt 1.


Boxplots

Eine geeignete grafische Darstellungsform für (mindestens) ordinalskalierte Daten ist der Boxplot. Er kann über die Funktion boxplot() angefordert werden:

boxplot(fb19$mdbf4)

Zur Erinnerung:

In diesem Beispiel betragen Median und Q3 jeweils 2, sodass sich die entsprechenden Linien überlagern. Ein Beispiel für einen “schöneren” Boxplot (ohne Überlagerung) ist dieses:

boxplot(fb19$mdbf2)

Auch ein Boxplot kann grafisch angepasst werden. Nachfolgend sehen Sie ein Beispiel, in dem möglichst viel verändert wurde, um die verschiedenen Möglichkeiten aufzuzeigen. Nicht alle Veränderungen sind unbedingt sinnvoll.

boxplot(fb19$mdbf2,
        horizontal = TRUE,
        main = "WS 2019/2020: Item mdbf1",
        xlab = "Ausprägung",
        las = 1,
        width = 2, 
        notch = TRUE,
        border = "red",
        col = "pink1")


Kurzer Exkurs :-)

install.packages("RXKCD")
library("RXKCD")
searchXKCD("significant")
getXKCD(539)


Kardinalskalierte Variablen in der Psychologie

Klassische kardinalskalierte Variablen

  • Behaviorale Maße: Reaktionszeiten, Bearbeitungsdauer, Anzahl von Fehlern, …
  • Biologische Maße: Hautleitfähigkeit, Stimmhöhe, Anzahl der Sakkaden, …
  • Neurophysiologische Maße: EEG-Daten, Durchblutung von Hirnregionen, …

Konstruierte kardinalskalierte Variablen

  • Fragebogendaten werden meist ordinalskaliert erhoben (einzelne Items)
  • Um Intervallskalenniveau zu erreichen werden Items zu Skalenwerten verrechnet (Summe oder Mittelwert)
  • Erzeugt viele mögliche Ausprägungen und wird als intervallskaliert behandelt

Beispiel: Lebenszufriedenheit

Der Mittelwert pro Person über alle 5 Items ist in der Spalte lz zu finden:

fb19$lz
##   [1] 5.60 4.40 3.40 5.40 3.60 4.40 6.00 4.80 4.80 5.20 3.20 6.40 5.20 5.00 4.40
##  [16] 5.40 4.00 4.00 4.60 2.40 6.40 3.40 4.80 4.60 7.00 4.20 6.20 5.20 6.20 3.80
##  [31] 6.60 5.80 5.80 3.00 2.00 5.60 5.40 3.80 4.20 6.20 4.80 4.00 4.60 7.00 5.40
##  [46] 5.20 5.20 4.80 6.40 6.40 4.20 5.80 3.40 6.40 6.00 4.60 4.40 5.60 7.00 5.60
##  [61] 3.60 4.60 4.80 6.00  NaN 6.00 6.60 5.20 6.20 4.80 5.00 4.80 5.00 5.60 5.40
##  [76] 6.00 6.40 5.40 5.20 4.80 6.00 5.00 5.20 4.20 4.00 6.40 6.80 5.40 5.60 4.80
##  [91] 3.40 5.20 3.00 6.40 6.60 5.60 4.60 3.60 4.40 3.20 4.20 1.80 5.80 4.40 4.80
## [106] 2.20 5.40 3.60 3.20 2.80 4.60 3.40 6.20 6.40 4.25 4.80 6.00 4.40

Deskriptivstatistik für kardinalskalierte Variablen

# Minimum & Maximum
range(fb19$lz, na.rm=T) 
## [1] 1.8 7.0
# Quartile
quantile(fb19$lz, c(.25, .5, .75), na.rm=T) 
## 25% 50% 75% 
## 4.2 5.0 5.8
#Box-Whisker Plot
boxplot(fb19$lz) 

Histogramme

# Histogramm
hist(fb19$lz) 

# Histogramm (20 Kategorien)
hist(fb19$lz, 
     breaks = 20) 

# Histogramm (ungleiche Kategorien)
hist(fb19$lz, 
     breaks = c(1, 3, 3.3, 3.6, 3.9, 4.5, 5, 7)) 

Mittelwert

Formel: \({x} = \frac{\sum_{m = 1}^n x_m}{n} = \frac{1}{n} \sum_{m = 1}^n x_m\)

# Arithmetisches Mittel
mean(fb19$lz, na.rm = TRUE)
## [1] 4.942308

Varianz

Formel: \(s^2_{X} = \frac{\sum_{m=1}^n (x_m - \bar{x})^2}{n}\)

# Händische Varianzberechnung
sum((fb19$lz - mean(fb19$lz, na.rm = TRUE))^2, na.rm = TRUE) / (nrow(fb19)-1)
## [1] 1.306778

Achtung! Wir benötigen für die Varianzberechnung n (s. Formel)! Wir nutzen hier nrow(fb19)-1, weil nrow(fb19) nicht das richtige n anzeigt (eine Person hat einen fehlenden Wert, daher die Anzahl an Zeilen minus der eine fehlende Wert = n)

Kleiner Diskurs zu fehlenden Werten:

Um zu prüfen, ob und wie viele fehlende Werte eine Variable hat, lässt sich z. B. folgende Syntax verwenden:

sum(is.na(fb19$lz))
## [1] 1

Um die Länge einer Variablen ohne fehlende Werte (also die Anzahl an Beobachtungen auf einer Variablen) zu bestimmen, lässt sich z. B. folgende Syntax verwenden:

length(na.omit(fb19$lz))
## [1] 117

Zur händischen Varianzberechnung können wir daher auch folgende Syntax verwenden:

# Händische Varianzberechnung
sum((fb19$lz - mean(fb19$lz, na.rm = TRUE))^2, na.rm = TRUE) / (length(na.omit(fb19$lz)))
## [1] 1.306778

Verschiedene Varianzschätzer

Folgendes Ergebnis liefert R, wenn wir die R-Funktion var() zur Berechnung der Varianz verwenden:

# R-interne Varianzberechnung
var(fb19$lz, na.rm = TRUE)
## [1] 1.318044

Warum erhalten wir hier einen abweichenden Wert im Vergleich zu unserer händischen Varianzberechnung?

Die meisten Programme berechnen nicht die empirische Varianz, sondern einen Schätzer der Populationsvarianz:

Empirische Varianz

\(s^2_{X} = \frac{\sum_{m=1}^n (x_m - \bar{x})^2}{n}\)

Schätzer der Populationsvarianz

\(\hat{\sigma}^2_{X} = \frac{\sum_{m=1}^n (x_m - \bar{x})^2}{n - 1}\)

Um in R die empirische Varianz mithilfe der var()-Funktion zu berechnen, kann man die Populationsvarianz nutzen. Multipliziert man sie mit \(\frac{n - 1}{n}\) erhält man die empirische Varianz.

# Umrechnung der Varianzen
var(fb19$lz, na.rm = TRUE) * (nrow(fb19) - 1) / nrow(fb19)
## [1] 1.306874

Achtung! Dies funktioniert in unserem Fall wieder nicht, da die Verwendung von nrow(fb19) - wie oben bereits angemerkt - nicht sinnvoll ist: nrow(fb19) ist nicht gleich n (eine Person hat einen fehlenden Wert), daher besser:

# Umrechnung der Varianzen
var(fb19$lz, na.rm = TRUE) * (length(na.omit(fb19$lz)) - 1) / (length(na.omit(fb19$lz)))
## [1] 1.306778

Alternativ:

# Umrechnung der Varianzen
var(fb19$lz, na.rm = TRUE) * (117 - 1) / 117 
## [1] 1.306778

Standardabweichung

Auch bei der Standardabweichung bestimmt R den Populationsschätzer \(\hat{\sigma}_{X}\)

# Standardabweichung in R
sd(fb19$lz, na.rm = TRUE) # Populationsschaetzer
## [1] 1.148061
# Händische Berechnung der empirischen Standardabweichung
sqrt(sum((fb19$lz - mean(fb19$lz, na.rm = TRUE))^2, 
         na.rm = TRUE) / (length(na.omit(fb19$lz))))
## [1] 1.143144

Zentrierung und Standardisierung

Die Variablenzentrierung und -standardisierung lässt sich in R per Hand berechnen…

# Zentrierung
lz_c <- fb19$lz - mean(fb19$lz, na.rm = TRUE)
head(lz_c)
## [1]  0.6576923 -0.5423077 -1.5423077  0.4576923 -1.3423077 -0.5423077
# Standardisierung
lz_z <- lz_c / sd(fb19$lz, na.rm = TRUE)
head(lz_z)
## [1]  0.5728723 -0.4723684 -1.3434024  0.3986655 -1.1691956 -0.4723684

…oder mit Hilfe bereits existierender Funktionen:

## Befehl zum Standardisieren
lz_z <- scale(fb19$lz)
## Befehl zum Zentrieren (ohne Standardisierung)
lz_c <- scale(fb19$lz,
              scale = FALSE) # unterbindet Standardisierung

Skalenwerte

Wiederholung: Konstruierte kardinalskalierte Variablen

  • Fragebogendaten werden meist ordinalskaliert erhoben (einzelne Items)
  • Um Intervallskalenniveau zu erreichen werden Items zu Skalenwerten verrechnet (Summe oder Mittelwert)
  • Erzeugt viele mögliche Ausprägungen und wird als intervallskaliert behandelt

Positive & Negative Items

Viele Fragebögen enthalten sowohl positiv als auch negativ forumulierte Items

  • …um die Befragung abwechslungsreich zu gestalten
  • …um das psychologische Konstrukt umfassender zu erheben
  • …um Antworttendenzen leichter identifizieren zu können

Vor der Skalenbildung müssen alle Items in eine Richtung gebracht werden: Rekodierung

Beispiel: MDBF

Erhebungsinstrument: Mehrdimensionaler Befindlichkeitsfragebogen (MDBF)

  • 3 Stimmungsdimensionen: gut vs. schlecht, wach vs. müde und ruhig vs. unruhig
  • Jeweils zwei positive, zwei negative Adjektive

Skala gut vs. schlecht:

Name Adjektiv Richtung
mdbf1 zufrieden positiv
mdbf4 schlecht negativ
mdbf8 gut positiv
mdbf11 unwohl negativ
  • Skala soll bei hohen Werten gute Stimmung darstellen
  • Negativ formulierte Items müssen invertiert werden
  • Mögliche Werte von 1 bis 5
  • Hierzu kennen Sie bereits zwei Möglichkeiten (mit den Befehlen und R-Kenntnissen aus den bisherigen Sitzungen…)

Rekodierung

Variante 1: Lineare Transformation

fb19$mdbf4_r <- -1 * (fb19$mdbf4 - 6)
head(fb19$mdbf4)
## [1] 1 3 1 2 4 2
head(fb19$mdbf4_r)
## [1] 5 3 5 4 2 4
  • Allgemeine Form: \(-1 \cdot (x_m - x_{\max} - 1)\)
  • Vorteil: schnell und einfach umsetzbar
  • Nachteil: nur für Invertierung sinnvoll, nicht allgemeiner anwendbar

Quizfrage: Ist dies eine zulässige Transformation für ordinalskalierte Variablen (wie Items)?
Antowrt: Ja, denn die Ordnungsrelation bleibt hierbei erhalten!

Variante 2: Logische Filter

fb19$mdbf11_r[fb19$mdbf11 == 1] <- 5
fb19$mdbf11_r[fb19$mdbf11 == 2] <- 4
fb19$mdbf11_r[fb19$mdbf11 == 3] <- 3
fb19$mdbf11_r[fb19$mdbf11 == 4] <- 2
fb19$mdbf11_r[fb19$mdbf11 == 5] <- 1

head(fb19$mdbf11)
## [1] 1 3 1 4 4 1
head(fb19$mdbf11_r)
## [1] 5 3 5 2 2 5
  • Durch logische Filter Personen auswählen, die auf Originalvariable den relevanten Wert haben
  • Auf rekodierter Variable neuen Wert zuweisen
  • Vorteil: extrem fexibel, jede Transformation möglich
  • Nachteil: umständlich zu schreiben

Skalenwerte erstellen

Skalenwerte werden zumeist als Summen oder Mittelwerte der Items erstellt

Skalenwert gut vs. schlecht

# Datensatz der relevanten Variablen
gut_schlecht <- fb19[, c('mdbf1', 'mdbf4_r', 'mdbf8', 'mdbf11_r')]
# Skalenwert in Originaldatensatz erstellen
fb19$gs <- rowMeans(gut_schlecht)
head(fb19$gs)
## [1] 4.50 3.00 4.25 3.00 2.25 4.25

Allgemeine Befehle

  • rowMeans Mittelwert für jede Zeile (über Variablen)
  • colMeans Mittelwert für jede Spalte (über Personen)
  • rowSums Summe für jede Zeile (über Variablen)
  • colSums Summe für jede Spalte (über Personen)